package com.chiyou.common.utils;

import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.Tuple;

/**
 * redis工具类实现有序集功能
 * key:attr-val,attr-val...
 * @author 陈嘉瑛
 * @version 2015-11-18
 *
 */
public class RedisUtilZset extends RedisBase{
	public void zadd(String key, double scope, String memeber){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zadd(key, scope, memeber);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	public void zadd(String key, Map<String, Double> scoreMembers){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zadd(key, scoreMembers);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 有序集合的成员数
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @return
	 */
	public long zcard(String key){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zcard(key);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 计算在有序集合中指定区间分数的成员数
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @return
	 */
	public long zcount(String key, double min,double max){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zcount(key, min, max);
		}finally{
			super.returnPool(jedis);
		}
	}

	/**
	 * 有序集合中对指定成员的分数加上增量 increment
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param score
	 * @param member
	 */
	public void zincrby(String key, double score,String member){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zincrby(key, score, member);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param dstkey
	 * @param sets
	 */
	public void zinterstore(String dstkey, String...sets){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zinterstore(dstkey, sets);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 在有序集合中计算指定字典区间内成员数量
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param min
	 * @param max
	 */
	public Long zlexcount(String key, String min, String max){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zcount(key, min, max);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 通过索引区间返回有序集合成指定区间内的成员
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @return 
	 */
	public Set<String> zrange(String key, long start, long end){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zrange(key, start, end);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 通过字典区间返回有序集合的成员 
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @return 
	 */
	public Set<String> zrange(String key, String min, String max){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zrangeByScore(key, min, max);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 通过分数返回有序集合指定区间内的成员
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @return 
	 */
	public Set<String> zrangeByScore(String key, double min, double max){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zrangeByScore(key, min, max);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 返回指定成员中的索引
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @return 
	 */
	public Long zrank(String key, String member){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zrank(key, member);
		}finally{
			super.returnPool(jedis);
		}
	}

	/**
	 * 移除多个成员
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @return 
	 */
	public void zrem(String key, String...members){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zrem(key, members);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 移除有序集合中给定的字典区间的所有成员
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param min
	 * @param max
	 */
	public void zremrangeByLex(String key, String min, String max){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zremrangeByScore(key, min, max);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 移除有序集合中给定的分数区间的所有成员
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param min
	 * @param max
	 */
	public void zremrangeByScore(String key, double min, double max){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zremrangeByScore(key, min, max);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 移除有序集合中给定的索引区间的所有成员
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param min
	 * @param max
	 */
	public void zremrangeByScore(String key, long min, long max){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zremrangeByRank(key, min, max);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 移除有序集合中指定成员
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param min
	 * @param max
	 */
	public void zrevrank(String key, String member){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			jedis.zrevrank(key, member);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 返回有序集中，成员的分数值
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param min
	 * @param max
	 */
	public double zscore(String key, String member){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zscore(key, member);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 计算给定的一个或多个有序集的并集，并存储在新的 key 中
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param sets
	 */
	public double zscore(String key, String...sets){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zunionstore(key, sets);
		}finally{
			super.returnPool(jedis);
		}
	}
	
	/**
	 * 迭代有序集合中的元素（包括元素成员和元素分值）
	 * 作者：陈嘉瑛
	 * 时间：2017-01-22
	 * @param key
	 * @param cursor
	 */
	public ScanResult<Tuple> zscan(String key, String cursor){
		Jedis jedis = null;
		try{
			jedis = super.getJedis();
			return jedis.zscan(key, cursor);
		}finally{
			super.returnPool(jedis);
		}
	}
	
}
